<?php

namespace App\Http\Controllers\Auth;

use App\Http\Controllers\Controller;
use App\Models\User;
use Illuminate\Http\Request;
use Ramsey\Uuid\Uuid;
use App\Models\DataTableModel\Folder;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Validator;
use Illuminate\Validation\ValidationException;
use Exception;

class RegisterController extends Controller
{
    public function register(Request $request)
    {
        try {
            $validator = Validator::make(
                $request->all(),
                [
                    'name' => ['required', 'string', 'max:255', 'unique:users'],
                    'email' => ['required', 'string', 'email', 'max:255', 'unique:users'],
                    'password' => ['required', 'string', 'min:8'],
                ],
                [
                    'name.required' => '用户名不能为空',
                    'email.required' => '邮箱不能为空',
                    'email.unique' => '邮箱已被注册',
                    'password.required' => '密码不能为空',
                    'password.min' => '密码长度不能少于8位',
                ]
            );

            if ($validator->fails()) {
                throw new ValidationException($validator);
            }

            $user = User::create([
                'name' => $request->name,
                'email' => $request->email,
                'password' => Hash::make($request->password),
            ]);

            // 创建用户文件夹（限制大小）

            // 生成5个随机英文字母
            $randomLetters = $this->generateRandomLetters(5);
            // 生成文件夹后半部分名称，使用UUID来确保唯一性
            $folderName = Uuid::uuid4()->toString();
            // 结合UUID和随机字母作为文件夹名称，，保证名字不是纯数字    
            $folderName = "{$randomLetters}_{$folderName}";
            // 用户默认的文件夹大小为3221225472字节，即3GB
            $storage_space=3221225472;
            // 在文件表中为新账户创建一个根文件夹  
            Folder::create([
                'folder_name' => $folderName,
                'id' => $user->id, // 关联到新注册的用户
                'storage_space'=>$storage_space,
            ]);

            // 创建用户文件夹（在UserNetworkDiskFile下面），如果尚未创建  
            $userFolder = 'UserNetworkDiskFile/' . $folderName; // 确保这个路径在 storage/app/public/ 下  
            if (!Storage::disk('public')->exists($userFolder)) {
                Storage::disk('public')->makeDirectory($userFolder);
            }

            return response()->json([
                'message' => '注册成功',
                'user' => $user, // 你可以返回整个用户对象，或者只返回你需要的字段  
            ], 201);
        } catch (ValidationException $e) {
            // 处理验证异常  
            // 你可以从异常对象中获取详细的错误信息  
            $errors = $e->validator->errors();
            return response()->json([
                'message' => '注册信息验证失败',
                'errors' => $errors,
            ], 422); // 422 Unprocessable Entity  
        } catch (Exception $e) {
            if (config('app.debug')) {
                // 在开发环境中返回详细的错误信息，并记录到日志  
                // \Log::error('Server internal error: ' . $e->getMessage() . PHP_EOL . $e->getTraceAsString());  

                // 注意：避免在生产环境中直接返回堆栈跟踪，因为这可能包含敏感信息  
                // 你可以只返回部分堆栈跟踪，或者仅当确实需要时才查看完整的日志  
                return response()->json([
                    'message' => '服务器内部错误：',
                    'error' => [
                        'message' => $e->getMessage(), // 具体的错误消息  
                        'file' => $e->getFile(), // 错误发生的文件  
                        'line' => $e->getLine(), // 错误发生的行号  
                        // 堆栈跟踪可能需要进一步处理，这里仅作为示例返回部分信息  
                        'trace' => array_slice(explode("\n", $e->getTraceAsString()), 0, 10), // 返回前10行堆栈跟踪作为示例  
                    ],
                    'code' => $e->getCode(), // 错误代码  
                ], 500);
            } else {
                // 在生产环境中只返回一般的错误信息，并记录到日志  
                // \Log::error('Server error: ' . $e->getMessage());  
                return response()->json([
                    'message' => '服务器错误，请稍后再试',
                ], 500);
            }
        }
    }

    private function generateRandomLetters($length)
    {
        $letters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
        $result = '';
        for ($i = 0; $i < $length; $i++) {
            $result .= $letters[rand(0, strlen($letters) - 1)];
        }
        return $result;
    }
}
